#include <iostream>
using namespace std;

#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>

/* 全局锁 */
pthread_mutex_t g_mutex;
/* 信号量 */
sem_t g_sem;
/* 打印机是公共资源 */
void printer(const char * str)
{
    /* 加锁 */
    // pthread_mutex_lock(&g_mutex);
    sem_wait(&g_sem);
    while(*str != '\0')
    {
        putchar(*str);
        fflush(stdout);
        str++;
        sleep(1);
    }
    /* 解锁 */
    // pthread_mutex_unlock(&g_mutex);
    sem_post(&g_sem);
}

/* 线程回调函数 */
void * thread_func1(void * arg)
{
    /* 线程分离 */
    pthread_detach(pthread_self());

    const char * str = "helloworld.";
    printer(str);

    pthread_exit(NULL);
}

void * thread_func2(void * arg)
{
    /* 线程分离 */
    pthread_detach(pthread_self());

    const char * str = "STM32F429IGT6";
    printer(str);
    pthread_exit(NULL);
}

int main()
{
    /* 初始化锁 */
    //pthread_mutex_init(&g_mutex,NULL);

    /* 初始化信号量 */
    sem_init(&g_sem,0,1);

    /* 创建线程 */
    pthread_t tid1;
    int ret = pthread_create(&tid1,NULL,thread_func1,NULL);
    if(ret != 0)
    {
        perror("thread1 create error!");
        exit(1);
    }

    pthread_t tid2;
    ret = pthread_create(&tid2,NULL,thread_func2,NULL);
    if(ret != 0)
    {
        perror("thread2 create error!");
        exit(1);
    }

    pause();

    /* 释放锁资源 */
    //pthread_mutex_destroy(&g_mutex);

    return 0;
}